#ifndef FACEOBJECT_H
#define FACEOBJECT_H

#include <QObject>
#include <seeta/FaceEngine.h>
#include <opencv.hpp>

// 人脸对象，主要用于：人脸数据存储/人脸检测/人脸识别
// 采用单例模式，降低程序开销
class FaceObject : public QObject {
    Q_OBJECT
public:
    static FaceObject *getInstance();        // 获取单例模式实例
    int64_t faceRegister(cv::Mat &fdata);    // 人脸注册
    bool detectFace(cv::Mat &fdata);         // 检测图像中是否存在人脸
    void deleteFace(int64_t face_id);        // 注销人脸信息

// 由于人脸查询是整个程序的性能瓶颈，因此将其定义为槽函数以便后续将其放置到单独线程中通过发送信号来执行
public slots:
    void faceQuery(cv::Mat &fdata);

signals:
    void sendFaceID(int64_t face_id);        // 发送人脸查询结果的信号函数

private:
    FaceObject() {};                         // 私有化构造函数
    FaceObject(const FaceObject &) = delete;
    FaceObject& operator=(const FaceObject &) = delete;
    void initEngine();                        // 初始化人脸识别引擎
    std::unique_ptr<seeta::FaceEngine> pfe_;  // 人脸识别引擎
    // 静态成员实例
    static std::unique_ptr<FaceObject> m_instance_;
};

#endif // FACEOBJECT_H
